package cn.kgc.shiro;


import org.apache.shiro.SecurityUtils;
import org.apache.shiro.authc.IncorrectCredentialsException;
import org.apache.shiro.authc.UnknownAccountException;
import org.apache.shiro.authc.UsernamePasswordToken;
import org.apache.shiro.mgt.DefaultSecurityManager;
import org.apache.shiro.realm.text.IniRealm;
import org.apache.shiro.subject.Subject;

/*
 *   shiro的基本认证流程
 *   1.Subject             认证主体
 *   2.SecurityManager    安全管理器
 *   3.Authenticator      认证器
 *   4.Authorizer        授权器
 *   5.Realm            域对象
 *
 * */
public class App {

    public static void main(String[] args) {

        //  创建默认的安全管理器
        DefaultSecurityManager defaultSecurityManager = new DefaultSecurityManager();
        // 创建域对象  Realm     ->  IniRealm   解析user.ini 数据源配置文件
        IniRealm iniRealm = new IniRealm("classpath:user.ini");
        // 安全管理器 注入 realm对象
        defaultSecurityManager.setRealm(iniRealm);
        SecurityUtils.setSecurityManager(defaultSecurityManager);
        //  1.获取认证主体   Subject      SecurityUtils 安全管理工具类
        Subject subject = SecurityUtils.getSubject();

        //  2.通过调用认证主体中的认证方法完成认证   interface AuthenticationToken     from  username  password
        UsernamePasswordToken usernamePasswordToken = new UsernamePasswordToken("admin", "12345");
        //  3. 认证是否通过   方法没有抛出异常则认证通过   UnknownAccountException    IncorrectCredentialsException
        try {

            subject.login(usernamePasswordToken);
            // 判定认证是否通过
            boolean authenticated = subject.isAuthenticated();
            System.out.println("authenticated = " + authenticated);
        }catch (UnknownAccountException e){
            System.out.println("用户名错误");
        }catch (IncorrectCredentialsException e){
            System.out.println("密码错误");
        }

    }
}
